/**
 * Created on [2018-11-28 10:48] by lidi
 * <p>
 * 项目名称: gaia-commons
 * <p>
 * 本程序版权属于福建慧政通信息科技有限公司所有。
 * <p>
 * 任何组织和个人未经福建慧政通信息科技有限公司许可与授权,不得擅自传播、复制、更改该程序的内容。
 * 本程序受版权法和国际条约的保护。如未经授权而擅自复制或传播本程序(或其中任何部分),
 * 将受到严厉的刑事及民事制裁，并将在法律许可的范围内受到最大可能的起诉!
 * <p>
 * ©2018 福建慧政通信息科技有限公司
 */

package com.lry.util;

import java.io.UnsupportedEncodingException;

/**
 * 提供常用的字符串工具方法。
 *
 * @author 李迪
 */
public final class StringUtil {

    /**
     * 私有化构造函数，防止外部实例化。
     */
    private StringUtil() {
    }

    /**
     * 判断指定的字符串是否为空。
     *
     * @param str 指定的字符串。
     * @return 如果指定的字符串为空返回true，否则，返回false。
     */
    public static boolean isEmpty(String str) {
        return str == null || str.length() == 0;
    }

    /**
     * 全角字符串转为半角字符串。
     *
     * @param sdcStr 全角字符串。
     * @return 全角字符串转换后的半角字符串。
     */
    public static String toDBC(String sdcStr) {
        char c[] = sdcStr.toCharArray();
        for (int i = 0; i < c.length; i++) {
            if (c[i] == '\u3000') {
                c[i] = ' ';
            } else if (c[i] > '\uFF00' && c[i] < '\uFF5F') {
                c[i] = (char) (c[i] - 65248);

            }
        }

        return new String(c);
    }

    /**
     * 半角字符串转为全角字符串。
     *
     * @param dbcStr 半角字符串。
     * @return 半角字符串转换后的全角字符串。
     */
    public static String toSBC(String dbcStr) {
        char c[] = dbcStr.toCharArray();
        for (int i = 0; i < c.length; i++) {
            if (c[i] == ' ') {
                c[i] = '\u3000';
            } else if (c[i] < '\177') {
                c[i] = (char) (c[i] + 65248);

            }
        }

        return new String(c);
    }

    /**
     * 将文件大小（字节）转换为常见的容量单位（如TB、GB、MB、KB、B）表示。
     *
     * @param fileSize 文件大小（字节）。
     * @return 转换为常见的容量单位（如TB、GB、MB、KB、B）表示的文件大小。
     */
    public static String formatFileSize(long fileSize) {
        long kb = 1024;
        long mb = kb * 1024;
        long gb = mb * 1024;
        long tb = gb * 1024;

        if (fileSize >= tb) {
            return String.format("%.1f TB", (float) fileSize / tb);
        } else if (fileSize >= gb) {
            return String.format("%.1f GB", (float) fileSize / gb);
        } else if (fileSize >= mb) {
            float f = (float) fileSize / mb;
            return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f);
        } else if (fileSize >= kb) {
            float f = (float) fileSize / kb;
            return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f);
        } else {
            return String.format("%d B", fileSize);
        }
    }

    /**
     * 获取GBK编码字符串的字节长度。
     *
     * @param str GBK编码字符串。
     * @return GBK编码字符串的字节长度。
     */
    public static int getLengthGBK(String str) {
        return getLength(str, "GBK");
    }

    /**
     * 获取UTF-8编码字符串的字节长度。
     *
     * @param str UTF-8编码字符串。
     * @return UTF-8编码字符串的字节长度。
     */
    public static int getLengthUTF8(String str) {
        return getLength(str, "UTF-8");
    }

    /**
     * 获取指定字符集字符串的字节长度。
     *
     * @param str         指定字符集的字符串。
     * @param charsetName 指定字符集。
     * @return 指定字符集字符串的字节长度。
     */
    public static int getLength(String str, String charsetName) {
        if (StringUtil.isEmpty(str)) {
            return 0;
        }

        int length = 0;

        try {
            length = str.getBytes(charsetName).length;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        return length;
    }
}
